package com.thread.threadfirst.SpringThreadPool;

import com.thread.threadfirst.ThreadFirstApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * 测试AsyncDemo类中的方法
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ThreadFirstApplication.class)
public class AsyncApplicationWithAnnotationTests {

    //注意：使用注解的方式来找到某个类的时候，需要在那某个类上添加Component/service/RestController/……注解 让其在程序启动后可以被动态注入。
    @Autowired
    AsyncDemo asyncDemo;

    @Test
    public void contextLoads() throws ExecutionException, InterruptedException {
        asyncDemo.asyncInvokeSimplest();
        asyncDemo.asyncInvokeWithParameter("test");
        //在执行最后一个任务之前先睡500毫秒再执行 显示出最后一个任务被自定义的线程池来执行了（显然队列空了 才能放入队列 被线程池中的线程所执行）
        Thread.sleep(500);
        Future<String> future = asyncDemo.asyncInvokeReturnFuture(100);
        System.out.println(future.get());  //get()方法阻塞 一直到获取到返回结果，get(long timeout, TimeUnit unit) 在设置时间内未返回结果，会直接抛出异常TimeoutException，messages为null。
//        String result = future.get(60, TimeUnit.SECONDS);//60s
    }

}
